#ifndef DATAACCESSOR_H
#define DATAACCESSOR_H

#include <QString>
#include <QByteArray>
#include "./entities/dbqueryresult.h"

class DataAccessor
{
public:
    DataAccessor() = delete;
    ~DataAccessor() = delete;
    DataAccessor(const DataAccessor&) = delete;
    DataAccessor& operator=(const DataAccessor&) = delete;

    // 在用户静态信息表中，通过UserId找到密码和盐值
    static bool findPasswordAndSaltByUserId(const int& userId, QByteArray& password, QString& salt);
    // 在用户动态信息表中，通过UserId找到在线状态
    static bool findOnlineStatusByUserId(const int& userId, bool& onlineStatus);
    // 在用户静态信息表中，通过Email判断用户是否注册过
    static bool findRegisteredUserByEmail(const QString& email, bool& isRegistered);
    // 在用户静态信息表中，插入新用户信息
    static bool insertNewUserStaticInfo(const QString& email, const QString& nickname,
                                  const QByteArray& password, const QString& salt);
    // 在用户动态信息表中，插入新用户信息
    static bool insertNewUserDynamicInfo(const int& userId);
    // 在用户动态信息表中，通过UserId修改用户在线状态
    static bool updateUserOnlineStatus(const int& userId, const bool& onlineStatus);
    // 在用户动态信息表中，修改全部用户在线状态
    static bool updateAllUserOnlineStatus(const bool& onlineStatus);
    // 在用户静态信息表中，通过Email找到UserId
    static bool findUserIdByEmail(const QString& email, int& userId);
    // 在用户静态信息表中，通过UserId找到Nickname
    static bool findUserInfoByUserId(const int& userId, QString& nickname);


    // 在好友关系申请表中，通过两个用户的Id查看是否已经有了待审核的申请
    static bool findUnverifiedApplication(const int& userId, const int& friendId, bool& existed);

    // 在好友关系申请表中，修改已经有了的请求信息（验证消息）
    static bool updateUnverifiedApplication(const int& userId, const int& friendId,
                                    const QString& alias, const QString& verifyInfo);

    // 在好友关系申请表中，插入没有验证过的好友申请
    static bool insertApplication(const int& userId, const int& friendId,
                                  const QString& alias, const QString& verifyInfo);
    // 在好友关系申请表中，通过userId查询所有好友申请（所有向user申请添加好友的请求）
    static bool findFriendApplicationsByUserId(const int& userId,
                                               QVector<NewFriendApplicationQueryResult>& results);
    // 在好友关系申请表中，通过两个人的id更改status
    // bool static updateFriendApplicationStatus(const int& status, const int& userId, const int& friendId);

    // 在好友关系申请表中，通过记录的id更改status
    static bool updateFriendApplicationStatusById(const int& id, const int status);

    // 在好友关系申请表中，通过记录id找两个人的id和昵称
    static bool findUserIdsAndAliasByRecordId(const int& serverId, int& userId, int& friendId, QString& alias);

    // 在好友关系表中，插入一条好友申请
    static bool insertFriendship(const int& userId, const int& friendId, QString& alias);

    // 在好友关系申请表中，查找user发送出去并且审核完成的记录
    static bool findAllNewFriendApplicationResults(const int& userId,
                                                QVector<FinishedFriendApplicationQueryResult>& results);

    // 在好友关系表中，查找好友关系记录
    static bool findFriendshipRecordBy2Id(const int& userId, const int& friendId, FriendshipQueryResult& result);

    // 在聊天消息缓存表中，存储聊天记录
    static bool insertChatMsg(const int& senderId, const int& receiverId,
                              const QString& chatMsg, int& uniqueId);

    // 在聊天消息缓存表中，根据某个receiverId查询所有聊天消息
    static bool findAllNewChatMsg(const int& receiverId, QVector<NewChatMsgQueryResult>& results);

    // 在聊天消息缓存表中，根据id更新聊天消息的转发状态
    static bool updateChatMsgStatusById(const int& id, const int& status);
};

#endif // DATAACCESSOR_H
